
/**
 * push到新页面
 *
 * @param {*} url 新页面路径
 * @param {*} [param=null] 传递的参数,key=param,json格式的字符串
 * @param {*} [success=null] 成功的回调,不传默认为空
 * @param {*} [fail=null] 失败的回调,不传默认为空
 * @param {*} [complete=null] 完成的回调(成功/失败均调用), 不传默认为空
 */
function push(url, param = null, success = null, fail = null, complete = null) {
    wx.navigateTo({
        url: url + "?param=" + JSON.stringify(param),
        success: (result) => {
            success ? success(result) : null
        },
        fail: (e) => { fail ? fail(e) : null }, complete: () => { complete ? complete() : null }
    });
}

/**
 * pop返回上一级页面
 * 
 * @param {*} jsonObject 回传的json对象,(注意该json对象的key,必须是上级页面data中已存在的key)
 */
function pop(jsonObject = null) {
    let curPages = getCurrentPages()
    let parentPage = curPages[curPages.length - 2];
    parentPage.setData(jsonObject)
    wx.navigateBack({
        delta: 1
    })
}

/**
 * pop返回指定的页面
 * 
 * (ps:该页面必须在路由栈中)
 * (ps2:页面路径必须满足page下页面文件夹平级,否则难以匹配正确的回跳路径及delta值!)
 *
 * @param {*} targetPageName 回退的目标页面名
 * @param {*} [jsonObject=null] 回退携带的参数,默认为空
 */
function popTo(targetPageName, jsonObject = null) {

    //基于页面的文件夹及页面同名, 通过拼装路径方式,保证页面的唯一性!
    //弊端是, 新页面的文件目录必须都在pages文件夹下,且所有页面文件夹必须平级
    let path = targetPageName + "/" + targetPageName;
    let targetPageIndex = 0;
    let targetPage = null;
    let curPages = getCurrentPages();
    for (let i = 0; i < curPages.length; i++) {
        const item = curPages[i];
        if (item.route.search(path) != -1) {
            targetPageIndex = i; //获取目标页面下标
            targetPage = curPages[i] //获取到目标页面
        }
    }
    if (!targetPage) {
        console.log("不存在该路由页面")
        return
    }
    // 计算 delta
    let delta = curPages.length - targetPageIndex;
    targetPage.setData(jsonObject)
    wx.navigateBack({
        delta: delta
    });
}


/**
 * redirect 替换当前路由,重定向到新页面
 *
 * @param {*} url 新页面路径
 * @param {*} [param=null] 传递的参数,默认为空
 * @param {*} [success=null] 成功回调,默认为空 
 * @param {*} [fail=null] 失败回调,默认为空
 * @param {*} [complete=null] 完成回调,默认为空
 */
function redirect(url, param = null, success = null, fail = null, complete = null) {
    wx.redirectTo({
        url: url + "?param=" + JSON.stringify(param),
        success: (result) => {
            success ? success(result) : null
        },
        fail: () => { fail ? fail() : null },
        complete: () => { complete ? complete() : null }
    });
}


/**
 * reLaunch 关闭所有页面,打开应用中某个页面(相当于重置路由)
 * 
 * (reLaunch 会关闭路由栈中所有路由, 重新开启一个新的路由页面)
 *
 * @param {*} url 页面路径
 * @param {*} [param=null] 传递的参数,默认为空
 * @param {*} [success=null] 成功回调,默认为空
 * @param {*} [fail=null] 失败回调,默认为空
 * @param {*} [complete=null] 完成回调,默认为空
 */
function relaunch(url, param = null, success = null, fail = null, complete = null) {
    wx.reLaunch({
        url: url + "?param=" + JSON.stringify(param),
        success: (result) => {
            success ? success(result) : null
        },
        fail: () => { fail ? fail() : null },
        complete: () => { complete ? complete() : null }
    });
}



module.exports = {
    push: push,
    pop: pop,
    popTo: popTo,
    redirect: redirect,
    relaunch: relaunch
}